VisualHMI - 定时器
VisualHMI的Lua脚本支持32个定时器(软件定时器),索引从0~31。当开启的定时器,超时溢出后,触发定时器回调,在回调函数里面执行相应操作。
本章节,演示定时器倒计时显示,并在定时完成后,下发指令给PLC设备;
适用范围:VisualHMI - HMI&M系列
例程下载链接:ViusalHMI - 定时器(点击下载)
1.API 说明
1.start_timer(timer_id, timeout, countdown, repeat)
启动定时器, 超时后系统自动调用 on_timer(...)
- timer_id:定时器 ID, 0~31
- timeout:超时时间, 单位毫秒
- countdown:0 顺计时, 1 倒计时
- repeat:重复次数, 0 表示无限重复
2.stop_timer(timer_id)
停止定时器
- timer_id:定时器ID,0~31,和start_timer搭配使用
3.on_timer(timer_id)
定时器超时回调函数
- timer_id:定时器ID,0~31
[!note|tip:注意] on_timer()是系统函数,使用时候,主动触发
2. 画面配置
2.1.定时器开关
添加一个位状态指示灯,关联LW1002寄存器,用于控制定时器的开启、关闭;
- 读取地址:LW1002
- 开关类型:切换开关
- 切换开关:√
- 使用图库:√
- 使用文字:√
添加两个滚轮控件,分别关联LW1000、LW1001寄存器,用于定时的时间设置,以“时”控件为例;
- 监视地址:LW1000
- 总项数:24
- 候选项:3
- 惯性:√
- 候选内容:0;1;2;3;4;5;6;7;8;9;10;...21;22;23;
- 控件权限:LW1002
添加一个文本控件关联LW1010寄存器,用于显示倒计时
- 读取地址:LW1010
3. Lua 脚本
点击位状态指示灯,当值等于1时候,触发定时器开启;值为0时候,关闭定时器。同时,获取倒计时的时间,并复位相关变量和控件值,代码如下所示
function on_update(slave,vtype,addr)
if vtype == VT_LW
then
if addr == 0x1002
then
local val = get_uint16(vtype,addr)
local hour = get_uint16(vtype,0x1000)
local minu = get_uint16(vtype,0x1001)
_TIMER_REPEAT_ = hour*60*60 + minu*60 --计算倒计时,单位s
set_notify(0) --设置倒计时,不发出指令通知
set_string(VT_LW, 0x1010, string.format('%02d', (_TIMER_REPEAT_ // (60*60))) ..':'..
string.format('%02d', ((_TIMER_REPEAT_ // (60)) % 60)) ..':'.. string.format('%02d', (_TIMER_REPEAT_ % 60)))
if val == 1
then
if _TIMER_REPEAT_ > 0 --倒计时大于1才执行
then
_TIMER_CNT_ = 0
stop_timer(0)
start_timer(0, 1000, 0, _TIMER_REPEAT_)
end
else
stop_timer(0)
end
end
end
end
定时器每秒回调触发on_timer(...),一共触发TIMER_REPEAT次,累计回调的次数TIMER_CNT,并计算出剩余的次数;当TIMER_CNT和TIMER_REPEAT相等时,表示定时结束,发送指令到PLC设备,代码如下所示
function on_timer(timer_id)
if timer_id == 0
then
_TIMER_CNT_ = _TIMER_CNT_ + 1--累计回调次数
local remaining = _TIMER_REPEAT_ - _TIMER_CNT_ --剩余次数
set_notify(0)
set_string(VT_LW, 0x1010, string.format('%02d', (remaining // (60*60))) ..':'..
string.format('%02d', ((remaining // (60)) % 60)) ..':'.. string.format('%02d', (remaining % 60))) --显示倒计时
if _TIMER_CNT_ == _TIMER_REPEAT_
then
set_uint16(VT_LW, 0x1002, 0x00)--复位定时器按钮
set_notify(1)
set_uint16(VT_LW, 0x1003, 0x01)--发指令通知主板
end
end
end
4. 运行预览
运行虚拟屏,设置定时器60秒,显示倒计时,定时结束后,发送指令给PLC,如下所示